<!DOCTYPE HTML>
<html>
<body>

  <p>将按键 "Q" 和 "W" 一起按下（在任何语言中都行）。</p>

  <script>
    function runOnKeys(func, ...codes) {
      let pressed = new Set();

      document.addEventListener('keydown', function(event) {
        pressed.add(event.code);

        for (let code of codes) { // 所有的按键都在集合中？
          if (!pressed.has(code)) {
            return;
          }
        }

        // 是的

        // 在 alert 期间，如果访客松开了按键，
        // JavaScript 就不会获得 "keyup" 事件
        // 那么集合 pressed 会保持假设这些按键是被按下的状态
        // 因此，为避免“粘滞”键，我们对状态进行了重置
        // 如果用户想再次运行热键 —— 他们需要再次按下所有键
        pressed.clear();

        func();
      });

      document.addEventListener('keyup', function(event) {
        pressed.delete(event.code);
      });

    }

    runOnKeys(
      () => alert("Hello!"),
      "KeyQ",
      "KeyW"
    );
  </script>

</body>

</html>
